#include <iostream>
#include <sstream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>

// 1. 实现数据的序列化
bool Serialize(const Json::Value &val, std::string &body)
{
    std::stringstream ss;
    // 2. 开始序列化
    // 先实例化一个工厂类对象
    // 通过工厂类对象生产派生类对象
    Json::StreamWriterBuilder swb;

    // JSON 标准规定：JSON 规范建议将非 ASCII 字符转义为 \uXXXX 形式，以确保最大兼容性
    //  jsoncpp 的默认行为：jsoncpp 的 StreamWriterBuilder 默认启用了将非 ASCII 字符转义的功能
    //  为了避免这种转义输出原始中文字符
    //  可以通过配置 StreamWriterBuilder 来禁用这种转义行为
    swb.settings_["emitUTF8"] = true; // 禁用 Unicode 转义

    // Json::StreamWriter * sw = swb.newStreamWriter();
    // sw->write(student, &std::cout);
    // // Json::StreamWriter 是被new出来的需要手动释放 防止内存泄漏
    // delete sw;

    // 或者使用智能指针
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
    int ret = sw->write(val, &ss);
    if(ret != 0)
    {
        std::cout<<"Serialize failed"<<std::endl;
        return false;
    }
    body = ss.str();
    return true;
}

// 2. 实现数据的反序列化
bool Deserialize(const std::string &body, Json::Value &val)
{
    // 先实例化一个工厂类对象
    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

    std::string errs; 
    bool ret = cr->parse(body.c_str(), body.c_str()+body.size(), &val, &errs);
    if(ret == false)
    {
        std::cout<<"Deserialize failed: "<<errs<<std::endl;
        return false;
    }
    return true;
}